/**
 * 权限缓存服务（DevOps Server）
 * 只处理与本系统相关的权限码，减少缓存和数据库查询
 */

import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import axios from 'axios';

@Injectable()
export class PermissionCacheService {
  private readonly logger = new Logger(PermissionCacheService.name);
  
  // 内存缓存（用于减少对 eorder-server 的请求）
  private readonly permissionCache = new Map<string, { permissions: string[]; timestamp: number }>();
  private readonly CACHE_TTL = 300000; // 5分钟

  // DevOps 系统相关的权限码前缀（用于过滤）
  private readonly DEVOPS_PERMISSION_PREFIXES = [
    'CREATE_WEBSITE',
    'SHOW_WEBSITE',
    'UPDATE_WEBSITE',
    'DELETE_WEBSITE',
    'SHOW_TRACKING',
    'EXPORT_TRACKING',
    'SHOW_PERFORMANCE',
    'CREATE_PERFORMANCE',
    'SHOW_SYSTEM',
    'CREATE_SYSTEM',
    'QUERY_METRICS',
    'CREATE_DEPLOYMENT',
    'SHOW_DEPLOYMENT',
    'UPDATE_DEPLOYMENT',
    'DELETE_DEPLOYMENT',
    'CREATE_RESOURCE',
    'SHOW_RESOURCE',
    'UPDATE_RESOURCE',
    'DELETE_RESOURCE',
    'CREATE_REPORT',
    'SHOW_REPORT',
    'UPDATE_REPORT',
    'DELETE_REPORT',
    'EXPORT_REPORT',
  ];

  constructor(
    private readonly configService: ConfigService,
  ) {}

  /**
   * 获取用户的权限码列表（只返回 DevOps 相关的权限）
   * @param userId 用户ID
   * @param roleCodes 用户角色代码数组
   * @param requestToken 请求中的 JWT token（可选，用于调用 eorder-server）
   * @returns 权限码数组（只包含 DevOps 相关权限）
   */
  async getUserPermissions(
    userId: number, 
    roleCodes: string[],
    requestToken?: string
  ): Promise<string[]> {
    const cacheKey = `user:${userId}:${roleCodes.sort().join(',')}`;
    
    // 检查内存缓存
    const cached = this.permissionCache.get(cacheKey);
    if (cached && Date.now() - cached.timestamp < this.CACHE_TTL) {
      this.logger.debug(`从内存缓存获取用户权限: userId=${userId}`);
      return cached.permissions;
    }

    try {
      // 从 eorder-server 获取用户权限（通过 HTTP 请求）
      const eorderServerUrl = this.configService.get<string>('EORDER_SERVER_URL') || 'http://localhost:2222';
      const token = requestToken || this.configService.get<string>('INTERNAL_API_TOKEN') || '';
      
      // 调用 eorder-server 的 /user/{userId}/permissions 接口
      const response = await axios.get(
        `${eorderServerUrl}/user/${userId}/permissions`,
        {
          headers: token ? {
            'Authorization': `Bearer ${token}`,
          } : {},
          timeout: 5000,
        }
      );

      if (response && response.data) {
        const responseData = response.data.data || response.data;
        const allPermissions = responseData.permissions || [];
        
        // 过滤出只与本系统相关的权限码
        const devopsPermissions = allPermissions.filter((perm: string) =>
          this.DEVOPS_PERMISSION_PREFIXES.some(prefix => perm.startsWith(prefix))
        );

        // 更新缓存
        this.permissionCache.set(cacheKey, {
          permissions: devopsPermissions,
          timestamp: Date.now(),
        });

        this.logger.debug(`用户权限已缓存: userId=${userId}, devops权限数=${devopsPermissions.length}`);
        return devopsPermissions;
      }

      return [];
    } catch (error: any) {
      this.logger.warn(`从 eorder-server 获取用户权限失败: ${error.message}`);
      // 如果请求失败，返回空数组（拒绝访问）
      return [];
    }
  }

  /**
   * 清除用户权限缓存
   * @param userId 用户ID
   */
  clearUserCache(userId: number): void {
    const keysToDelete: string[] = [];
    for (const key of this.permissionCache.keys()) {
      if (key.startsWith(`user:${userId}:`)) {
        keysToDelete.push(key);
      }
    }
    keysToDelete.forEach(key => this.permissionCache.delete(key));
    this.logger.debug(`已清除用户权限缓存: userId=${userId}`);
  }

  /**
   * 清除所有缓存
   */
  clearAllCache(): void {
    this.permissionCache.clear();
    this.logger.debug('已清除所有权限缓存');
  }
}

